名称空间
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
为了使得我们的代码模块尽可能的不和其他人的代码发生冲突(变量命名冲突,函数命名冲突等等),我们需要引入名称空间的概念,虽然 JavaScript 本身没有定义名称空间,但是使用 JavaScript 的对象本身的一些特性,我们可以模拟出名称空间来。
var jscore = jscore || {};
jscore.util = jscore.util || {};
jscore.util.common = {
raiseError : function(message){
throw new Error(message);
},
showMessage : function(info){
print(info);
}
}
我们建立了一个 jscore 对象,jscore 有个 util 属性,同样 util 也是一个对象,而 common 对象则为 util 的一个属性。当我们想要访问 raiseError 或者 showMessage 两个函数时,必须加上 jscore.util.common 前缀才可以。
jscore.util.common.raiseError("An I/O Error occured"); jscore.util.common.showMessage("This is a message for you");
否则解释器会提示,函数未定义的错误。通过这种方式,我们可以尽可能的避免别人使用了我们的变量名或者相反,而且这种记法与 Java/python 这些语言中的包概念很相似。所以建议大家使用这种规则来管理自己的包。 当然,你可能发现这种方式虽然较好,但是写起来比较麻烦,这一点你需要仔细权衡,因为 当你的项目变大比较大,而且模块划分越来越细,你就会发现这样的麻烦比起维护变量冲突 来说,简直不算什么。 我们将 namespace 的过程再简化一下,提供一个方法出来,这样用户可以使用字符串来创建一个名字空间,这样不是更方便吗?
var __global__ = this;
var jscore = jscore || {};
jscore.util = jscore.util || {};
jscore.util.namespace = function(name){
var parent = __global__;
var array = name.split(".");
for(var i = 0, len = array.length; i < len; i++){
parent[array[i]] = parent[array[i]] || {};
parent = parent[array[i]];
}
}
有了 jscore.util.namespace 方法,我们可以很快速的定义一个新的名字空间,比如一个 与 UI 相关的工具包,名叫 uikit,uikit 下有个名叫 ui 的子包,用以封装真是的绘画逻辑:
jscore.util.namespace("uikit.ui");//定义新的名称空间
uikit.ui.showMessage = function(msg){
var tag = new Date().toString();
print("["+tag+"] "+msg);
}//该名称空间下的一个方法
uikit.ui.showMessage("initializing the net-work envirnoment..."); uikit.ui.showMessage("initializing the graphcis envirnoment...");
测试之:
[Apr 25 2010 17:08:25] initializing the net-work envirnoment...
[Apr 25 2010 17:08:25] initializing the graphcis envirnoment...
在线练习
{$ activeFileHint $}